home *** CD-ROM | disk | FTP | other *** search
/ 3D GFX / 3D GFX.iso / amiutils / i_l / irit5 / triv_lib / triv_aux.c < prev    next >
C/C++ Source or Header  |  1995-12-30  |  11KB  |  255 lines

  1. /******************************************************************************
  2. * Triv_aux.c - auxiliary routine to interface to tri-variate rep.          *
  3. *******************************************************************************
  4. * Written by Gershon Elber, Sep. 94.                          *
  5. ******************************************************************************/
  6.  
  7. #include "triv_loc.h"
  8.  
  9. /*****************************************************************************
  10. * DESCRIPTION:                                                               M
  11. * Given a tri-variate, returns its parametric domain.                 M
  12. *                                                                            *
  13. * PARAMETERS:                                                                M
  14. *   TV:           Trivariate function to consider.                           M
  15. *   UMin, UMax:   U Domain of TV will be placed herein.                      M
  16. *   VMin, VMax:   V Domain of TV will be placed herein.                      M
  17. *   WMin, WMax:   W Domain of TV will be placed herein.                      M
  18. *                                                                            *
  19. * RETURN VALUE:                                                              M
  20. *   void                                                                     M
  21. *                                                                            *
  22. * KEYWORDS:                                                                  M
  23. *   TrivTVDomain, trivariates                                                M
  24. *****************************************************************************/
  25. void TrivTVDomain(TrivTVStruct *TV,
  26.           CagdRType *UMin,
  27.           CagdRType *UMax,
  28.           CagdRType *VMin,
  29.           CagdRType *VMax,
  30.           CagdRType *WMin,
  31.           CagdRType *WMax)
  32. {
  33.     int UOrder,    VOrder, WOrder, ULen, VLen, WLen;
  34.  
  35.     switch (TV -> GType) {
  36.     case TRIV_TVBEZIER_TYPE:
  37.         *UMin = 0.0;
  38.         *UMax = 1.0;
  39.         *VMin = 0.0;
  40.         *VMax = 1.0;
  41.         *WMin = 0.0;
  42.         *WMax = 1.0;
  43.         break;
  44.     case TRIV_TVBSPLINE_TYPE:
  45.         UOrder = TV -> UOrder;
  46.         VOrder = TV -> VOrder;
  47.         WOrder = TV -> WOrder;
  48.         ULen = TV -> ULength;
  49.         VLen = TV -> VLength;
  50.         WLen = TV -> WLength;
  51.  
  52.         *UMin = TV -> UKnotVector[UOrder - 1];
  53.         *UMax = TV -> UKnotVector[ULen];
  54.         *VMin = TV -> VKnotVector[VOrder - 1];
  55.         *VMax = TV -> VKnotVector[VLen];
  56.         *WMin = TV -> WKnotVector[WOrder - 1];
  57.         *WMax = TV -> WKnotVector[WLen];
  58.         break;
  59.     default:
  60.         TRIV_FATAL_ERROR(TRIV_ERR_UNDEF_GEOM);
  61.         break;
  62.     }
  63. }
  64.  
  65. /*****************************************************************************
  66. * DESCRIPTION:                                                               M
  67. * Given a tri-variate and a domain - validate it.                 M
  68. *                                                                            *
  69. * PARAMETERS:                                                                M
  70. *   TV:       To make sure t is in its Dir domain.                           M
  71. *   t:        Parameter value to verify.                                     M
  72. *   Dir:      Direction. Either U or V or W.                                 M
  73. *                                                                            *
  74. * RETURN VALUE:                                                              M
  75. *   CagdBType:    TRUE if in domain, FALSE otherwise.                        M
  76. *                                                                            *
  77. * KEYWORDS:                                                                  M
  78. *   TrivParamInDomain, trivariates                                           M
  79. *****************************************************************************/
  80. CagdBType TrivParamInDomain(TrivTVStruct *TV, CagdRType t, TrivTVDirType Dir)
  81. {
  82.     CagdRType UMin, UMax, VMin, VMax, WMin, WMax;
  83.  
  84.     TrivTVDomain(TV, &UMin, &UMax, &VMin, &VMax, &WMin, &WMax);
  85.  
  86.     switch (Dir) {
  87.     case TRIV_CONST_U_DIR:
  88.         return t >= UMin && t <= UMax;
  89.     case TRIV_CONST_V_DIR:
  90.         return t >= VMin && t <= VMax;
  91.     case TRIV_CONST_W_DIR:
  92.         return t >= WMin && t <= WMax;
  93.     default:
  94.         TRIV_FATAL_ERROR(TRIV_ERR_WRONG_DOMAIN);
  95.         return FALSE;
  96.     }
  97. }
  98.  
  99. /*****************************************************************************
  100. * DESCRIPTION:                                                               M
  101. * Given a tri-variate and a domain - validate it.                 M
  102. *                                                                            *
  103. * PARAMETERS:                                                                M
  104. *   TV:       To make sure (u, v, w) is in its domain.                       M
  105. *   u, v, w:  To verify if it is in TV's parametric domain.                  M
  106. *                                                                            *
  107. * RETURN VALUE:                                                              M
  108. *   CagdBType:   TRUE if in domain, FALSE otherwise.                         M
  109. *                                                                            *
  110. * KEYWORDS:                                                                  M
  111. *   TrivParamsInDomain, trivariates                                          M
  112. *****************************************************************************/
  113. CagdBType TrivParamsInDomain(TrivTVStruct *TV,
  114.                  CagdRType u,
  115.                  CagdRType v,
  116.                  CagdRType w)
  117. {
  118.     CagdRType UMin, UMax, VMin, VMax, WMin, WMax;
  119.  
  120.     TrivTVDomain(TV, &UMin, &UMax, &VMin, &VMax, &WMin, &WMax);
  121.  
  122.     return u >= UMin && u <= UMax &&
  123.            v >= VMin && v <= VMax &&
  124.        w >= WMin && w <= WMax;
  125. }
  126.  
  127. /*****************************************************************************
  128. * DESCRIPTION:                                                               M
  129. * Given a tri-variate, returns a sub-region of it.                           M
  130. *                                                                            *
  131. * PARAMETERS:                                                                M
  132. *   TV:        To extract asub-region from.                                  M
  133. *   t1, t1:    Domain to extract from TV, in parametric direction Dir.       M
  134. *   Dir:       Direction to extract the sub-region. Either U or V or W.      M
  135. *                                                                            *
  136. * RETURN VALUE:                                                              M
  137. *   TrivTVStruct *:   A sub-region of TV from t1 to t2 in direction Dir.     M
  138. *                                                                            *
  139. * KEYWORDS:                                                                  M
  140. *   TrivTVRegionFromTV, trivariates                                          M
  141. *****************************************************************************/
  142. TrivTVStruct *TrivTVRegionFromTV(TrivTVStruct *TV,
  143.                  CagdRType t1,
  144.                  CagdRType t2,
  145.                  TrivTVDirType Dir)
  146. {
  147.     CagdRType RMin, RMax, SMin, SMax, TMin, TMax, R1, R2;
  148.     TrivTVStruct *TVs;
  149.     CagdBType
  150.     NewTV = FALSE;
  151.  
  152.     switch (TV -> GType) {
  153.     case TRIV_TVBEZIER_TYPE:
  154.         TMin = 0.0;
  155.         TMax = 1.0;
  156.         break;
  157.     case TRIV_TVBSPLINE_TYPE:
  158.             switch (Dir) {
  159.         case TRIV_CONST_U_DIR:
  160.             TrivTVDomain(TV, &R1, &R2, &SMin, &SMax, &TMin, &TMax);
  161.             break;
  162.         case TRIV_CONST_V_DIR:
  163.             TrivTVDomain(TV, &RMin, &RMax, &R1, &R2, &TMin, &TMax);
  164.             break;
  165.         case TRIV_CONST_W_DIR:
  166.             TrivTVDomain(TV, &RMin, &RMax, &SMin, &SMax, &R1, &R2);
  167.             break;
  168.         default:
  169.             TRIV_FATAL_ERROR(TRIV_ERR_DIR_NOT_VALID);
  170.             break;
  171.         }
  172.         break;
  173.     default:
  174.         TRIV_FATAL_ERROR(TRIV_ERR_UNDEF_GEOM);
  175.         return NULL;
  176.     }
  177.  
  178.     if (t1 > t2)
  179.     SWAP(CagdRType, t1, t2);
  180.  
  181.     if (!APX_EQ(t1, TMin)) {
  182.     TVs = TrivTVSubdivAtParam(TV, t1, Dir);
  183.     TV = TVs -> Pnext;
  184.     TVs -> Pnext = NULL;
  185.     TrivTVFree(TVs);               /* Free the first region. */
  186.     NewTV = TRUE;
  187.     }
  188.  
  189.     if (APX_EQ(t2, TMax))
  190.     return NewTV ? TV : TrivTVCopy(TV);
  191.     else {
  192.     TVs = TrivTVSubdivAtParam(TV, t2, Dir);
  193.  
  194.     if (NewTV)
  195.         TrivTVFree(TV);
  196.  
  197.         TrivTVFree(TVs -> Pnext);          /* Free the second region. */
  198.         TVs -> Pnext = NULL;
  199.     return TVs;                /* Returns the first region. */
  200.     }
  201. }
  202.  
  203. /*****************************************************************************
  204. * DESCRIPTION:                                                               M
  205. * Computes a bounding box for a trivariate freeform function.             M
  206. *                                                                            *
  207. * PARAMETERS:                                                                M
  208. *   Trivar:   To compute a bounding box for.                                 M
  209. *   BBox:     Where bounding information is to be saved.                     M
  210. *                                                                            *
  211. * RETURN VALUE:                                                              M
  212. *   void                                                                     M
  213. *                                                                            *
  214. * KEYWORDS:                                                                  M
  215. *   TrivTVBBox, bbox, bounding box                                           M
  216. *****************************************************************************/
  217. void TrivTVBBox(TrivTVStruct *Trivar, CagdBBoxStruct *BBox)
  218. {
  219.     TrivTVStruct
  220.     *E3TV = TrivCoerceTVTo(Trivar, CAGD_PT_E3_TYPE);
  221.     int Length = E3TV -> ULength * E3TV -> VLength * E3TV -> WLength;
  222.     CagdRType
  223.     **Points = E3TV -> Points;
  224.  
  225.     CagdPointsBBox(Points, Length, BBox);
  226.  
  227.     TrivTVFree(E3TV);
  228. }
  229.  
  230. /*****************************************************************************
  231. * DESCRIPTION:                                                               M
  232. * Computes a bounding box for a list of trivariate freeform function.        M
  233. *                                                                            *
  234. * PARAMETERS:                                                                M
  235. *   Trivars:  To compute a bounding box for.                                 M
  236. *   BBox:     Where bounding information is to be saved.                     M
  237. *                                                                            *
  238. * RETURN VALUE:                                                              M
  239. *   void                                                                     M
  240. *                                                                            *
  241. * KEYWORDS:                                                                  M
  242. *   TrivTVListBBox, bbox, bounding box                                       M
  243. *****************************************************************************/
  244. void TrivTVListBBox(TrivTVStruct *TVs, CagdBBoxStruct *BBox)
  245. {
  246.     CAGD_RESET_BBOX(BBox);
  247.  
  248.     for ( ; TVs != NULL; TVs = TVs -> Pnext) {
  249.     CagdBBoxStruct TmpBBox;
  250.  
  251.     TrivTVBBox(TVs, &TmpBBox);
  252.     CagdMergeBBox(BBox, &TmpBBox);
  253.     }
  254. }
  255.